#pragma once

#include<unordered_map>
#include<functional>
#include<ctime>
#include<unistd.h>
using namespace std;
using task_t = std::function<void()>;




void DownLoad()
{
	std::cout<<"我是下载任务  pid: "<<getpid()<<std::endl;
}

void Log()
{
	std::cout<<"我是日志任务  pid: "<<getpid()<<std::endl;
}

void Sql()
{
	std::cout<<"我是数据库同步任务  pid: "<<getpid()<<std::endl;
}


int number=0;
//模拟任务
class Task
{

	public:
		Task()//直接把任务装载好。执行任务和选择任务就用编号了。
		{
			srand(time(nullptr));
			InsertTask(DownLoad);
			InsertTask(Log);
			InsertTask(Sql);
		}
		~Task(){}
		void InsertTask(task_t t)
		
		{
			tasks[number++]=t;
		}

		int SelectTask()
		{
			//采用轮着来的也就是轮询方式去旋转进程去执行。。
			return rand()%number;//这里是在随机的选择任务，模拟选择任务
		}


		void Excute(int number)//执行任务
		{
			if(tasks.find(number) == tasks.end()) return;
			tasks[number]();//执行任务


		}
	private:
		std::unordered_map<int,task_t> tasks;
};

Task tm1;


void Worker()
{
//直接从0里读.
//      
        while(true)
        {
                int cmd=0;
                int n=::read(0,&cmd,sizeof(cmd));
                if(n==sizeof(cmd))//成功读取
                {
                        tm1.Excute(cmd);
                }
                else if(n==0)//master进程写端关闭了。子进程读到0
                {
                        cout<<"pid: "<<getpid()<<" quit.."<<endl;
                        break;
                }

                else
                {
                }
        }
}


